package com.example.course.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.course.dto.CourseDTO;
import com.example.course.dto.CourseQueryDTO;
import com.example.course.service.CoursesService;
import com.example.course.tool.R;
import com.example.course.vo.CourseVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * 课程控制器，处理与课程相关的HTTP请求
 *
 * @author Jasmine-drs
 * @date 2025/4/25 11:00
 */
@Slf4j
@RestController
@RequestMapping("/courses")
@AllArgsConstructor
@Api(tags = "课程管理接口")
public class CourseController {
	private final CoursesService coursesService;

	/**
	 * 获取课程列表
	 *
	 * @param queryDTO 查询条件
	 * @return 课程列表
	 */
	@GetMapping
	@ApiOperation("获取课程列表")
	public R<Page<CourseVO>> getCourseList(@Valid CourseQueryDTO queryDTO) {
		log.info("请求获取课程列表：{}", queryDTO);

		try {
			// 调用服务层获取课程列表
			Page<CourseVO> page = coursesService.getCourseList(queryDTO);
			return R.success(page);
		} catch (Exception e) {
			log.error("获取课程列表异常", e);
			return R.err("获取课程列表失败：" + e.getMessage());
		}
	}

	/**
	 * 获取课程详情
	 *
	 * @param id 课程ID
	 * @return 课程详情
	 */
	@GetMapping("/{id}")
	@ApiOperation("获取课程详情")
	public R<CourseVO> getCourseDetail(@ApiParam(value = "课程ID", required = true) @PathVariable Integer id) {
		log.info("请求获取课程详情，ID：{}", id);

		try {
			// 调用服务层获取课程详情
			CourseVO courseVO = coursesService.getCourseById(id);
			return R.success(courseVO);
		} catch (IllegalArgumentException e) {
			log.warn("获取课程详情参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("获取课程详情异常", e);
			return R.err("获取课程详情失败：" + e.getMessage());
		}
	}

	/**
	 * 添加课程（教师功能）
	 *
	 * @param courseDTO 课程信息
	 * @param userId    用户ID，用于身份验证
	 * @return 添加结果
	 */
	@PostMapping
	@ApiOperation("添加课程（教师功能）")
	public R<CourseVO> addCourse(
			@ApiParam(value = "课程信息", required = true) @Valid @RequestBody CourseDTO courseDTO,
			@ApiParam(value = "用户ID", required = true) @RequestParam Integer userId) {
		log.info("请求添加课程：{}，用户ID：{}", courseDTO, userId);

		try {
			// 检查用户是否为教师
			if (!coursesService.isTeacher(userId)) {
				return R.err("权限不足，只有教师可以添加课程");
			}

			// 调用服务层添加课程
			CourseVO courseVO = coursesService.addCourse(courseDTO);
			return R.success(courseVO);
		} catch (IllegalArgumentException e) {
			log.warn("添加课程参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("添加课程异常", e);
			return R.err("添加课程失败：" + e.getMessage());
		}
	}

	/**
	 * 更新课程（教师功能）
	 *
	 * @param id        课程ID
	 * @param courseDTO 课程信息
	 * @param userId    用户ID，用于身份验证
	 * @return 更新结果
	 */
	@PutMapping("/{id}")
	@ApiOperation("更新课程（教师功能）")
	public R<CourseVO> updateCourse(
			@ApiParam(value = "课程ID", required = true) @PathVariable Integer id,
			@ApiParam(value = "课程信息", required = true) @Valid @RequestBody CourseDTO courseDTO,
			@ApiParam(value = "用户ID", required = true) @RequestParam Integer userId) {
		log.info("请求更新课程，ID：{}，课程信息：{}，用户ID：{}", id, courseDTO, userId);

		try {
			// 检查用户是否为教师
			if (!coursesService.isTeacher(userId)) {
				return R.err("权限不足，只有教师可以更新课程");
			}

			// 调用服务层更新课程
			CourseVO courseVO = coursesService.updateCourse(id, courseDTO);
			return R.success(courseVO);
		} catch (IllegalArgumentException e) {
			log.warn("更新课程参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("更新课程异常", e);
			return R.err("更新课程失败：" + e.getMessage());
		}
	}

	/**
	 * 删除课程（教师功能）
	 *
	 * @param id     课程ID
	 * @param userId 用户ID，用于身份验证
	 * @return 删除结果
	 */
	@DeleteMapping("/{id}")
	@ApiOperation("删除课程（教师功能）")
	public R<Boolean> deleteCourse(
			@ApiParam(value = "课程ID", required = true) @PathVariable Integer id,
			@ApiParam(value = "用户ID", required = true) @RequestParam Integer userId) {
		log.info("请求删除课程，ID：{}，用户ID：{}", id, userId);

		try {
			// 检查用户是否为教师
			if (!coursesService.isTeacher(userId)) {
				return R.err("权限不足，只有教师可以删除课程");
			}

			// 调用服务层删除课程
			boolean result = coursesService.deleteCourse(id);
			return R.success(result);
		} catch (IllegalArgumentException e) {
			log.warn("删除课程参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("删除课程异常", e);
			return R.err("删除课程失败：" + e.getMessage());
		}
	}
} 